bitkeeper revision 1.1159.129.1 (417910b3OLNctbN0leCgFvn5gSulDQ)
authorcl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>
Fri, 22 Oct 2004 13:52:51 +0000 (13:52 +0000)
committercl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>
Fri, 22 Oct 2004 13:52:51 +0000 (13:52 +0000)
Fix control channel reconnect after xend restart.

tools/python/xen/xend/XendConsole.py
tools/python/xen/xend/XendDomainInfo.py
tools/python/xen/xend/server/SrvDaemon.py
tools/python/xen/xend/server/channel.py
tools/python/xen/xend/server/console.py
tools/python/xen/xend/server/controller.py

index 6825dc5baab73269f23e19649c468022c63ca7d8..ea79645be91bf4d9ea1ceebbf05a317ab694af29 100644 (file)
@@ -32,8 +32,9 @@ class XendConsole:
     def consoles(self):
         return daemon.get_consoles()
     
-    def console_create(self, dom, console_port=None):
-        consinfo = daemon.console_create(dom, console_port=console_port)
+    def console_create(self, dom, console_port=None, remote_port=0):
+        consinfo = daemon.console_create(dom, console_port=console_port,
+                                         remote_port=remote_port)
         return consinfo
     
     def console_get(self, id):
index 031b1a4143fe4e3eaad86daf917ea81f6d06bbc0..18d4d5945c43fda7f9a6ad13e21bb148bafc677b 100644 (file)
@@ -733,7 +733,8 @@ class XendDomainInfo:
         if self.console:
             self.console.registerChannel()
         else:
-            self.console = xendConsole.console_create(self.dom, console_port=self.console_port)
+            self.console = xendConsole.console_create(
+                self.dom, console_port=self.console_port, remote_port=1)
         self.build_domain(ostype, kernel, ramdisk, cmdline)
         self.image = kernel
         self.ramdisk = ramdisk
index c6c4282eee22f66f0631b2277faa8d5ac9d620ea..42b8a8ca392c0404356ead21c507307b8182b5db 100644 (file)
@@ -669,12 +669,13 @@ class Daemon:
     def netif_get(self, dom):
         return self.netifCF.getControllerByDom(dom)
 
-    def console_create(self, dom, console_port=None):
+    def console_create(self, dom, console_port=None, remote_port=0):
         """Create a console for a domain.
         """
         console = self.consoleCF.getControllerByDom(dom)
         if console is None:
-            console = self.consoleCF.createController(dom, console_port)
+            console = self.consoleCF.createController(dom, console_port,
+                                                      remote_port=remote_port)
         return console
 
     def consoles(self):
index 4c6dbadd17e8d321a5d19b5ef81ef92ddca95449..57861b626a9c1bda8b24587b56e25d17e69db23f 100755 (executable)
@@ -45,7 +45,7 @@ class ChannelFactory:
             del self.channels[idx]
             self.notifier.unbind(idx)
 
-    def domChannel(self, dom):
+    def domChannel(self, dom, remote_port=0):
         """Get the channel for the given domain.
         Construct if necessary.
 
@@ -55,7 +55,7 @@ class ChannelFactory:
         """
         chan = self.getDomChannel(dom)
         if not chan:
-            chan = Channel(self, dom)
+            chan = Channel(self, dom, remote_port=remote_port)
             self.addChannel(chan)
         return chan
 
@@ -91,10 +91,10 @@ class ChannelFactory:
         """
         self.delChannel(channel.idx)
 
-    def createPort(self, dom):
+    def createPort(self, dom, remote_port=0):
         """Create a port for a channel to the given domain.
         """
-        return xu.port(dom)
+        return xu.port(dom, remote_port)
 
 def channelFactory():
     """Singleton constructor for the channel factory.
@@ -200,7 +200,7 @@ class Channel(BaseChannel):
     are multiplexed over the channel (console, block devs, net devs).
     """
 
-    def __init__(self, factory, dom):
+    def __init__(self, factory, dom, remote_port=0):
         """Create a channel to the given domain using the given factory.
 
         Do not call directly, use domChannel on the factory.
@@ -209,7 +209,7 @@ class Channel(BaseChannel):
         # Domain.
         self.dom = int(dom)
         # Domain port (object).
-        self.port = self.factory.createPort(dom)
+        self.port = self.factory.createPort(dom, remote_port=remote_port)
         # Channel port (int).
         self.idx = self.port.local_port
         # Registered devices.
index 666ffca2ff7a3f87ec568a869007f53355697360..3d302dbe3f93544f5fc3144942e1fb2881ab03d1 100755 (executable)
@@ -81,13 +81,14 @@ class ConsoleControllerFactory(controller.ControllerFactory):
     """Factory for creating console controllers.
     """
 
-    def createController(self, dom, console_port=None):
+    def createController(self, dom, console_port=None, remote_port=0):
         if console_port is None:
             console_port = CONSOLE_PORT_BASE + dom
         for c in self.getControllers():
             if c.console_port == console_port:
                 raise XendError('console port in use: ' + str(console_port))
-        console = ConsoleController(self, dom, console_port)
+        console = ConsoleController(self, dom, console_port,
+                                    remote_port=remote_port)
         self.addController(console)
         log.info("Created console id=%s domain=%d port=%d",
                  console.idx, console.dom, console.console_port)
@@ -111,8 +112,9 @@ class ConsoleController(controller.Controller):
     STATUS_CONNECTED = 'connected'
     STATUS_LISTENING = 'listening'
 
-    def __init__(self, factory, dom, console_port):
-        controller.Controller.__init__(self, factory, dom)
+    def __init__(self, factory, dom, console_port, remote_port=0):
+        controller.Controller.__init__(self, factory, dom,
+                                       remote_port=remote_port)
         self.addMethod(CMSG_CONSOLE, 0, None)
         self.status = self.STATUS_NEW
         self.addr = None
index 3721b9b3b3349214ee71fcf095ce23c14ee36313..35be718631a6463f1b870abc5f8d3ebac6f7e2b0 100755 (executable)
@@ -68,7 +68,7 @@ class CtrlMsgRcvr:
     @type responders: {int:Responder}
     """
 
-    def __init__(self):
+    def __init__(self, remote_port = 0):
         self.channelFactory = channel.channelFactory()
         self.majorTypes = {}
         self.dom = None
@@ -76,6 +76,7 @@ class CtrlMsgRcvr:
         self.idx = None
         self.responders = {}
         self.timeout = 10
+        self.remote_port = remote_port
 
     def setTimeout(self, timeout):
         self.timeout = timeout
@@ -217,7 +218,8 @@ class CtrlMsgRcvr:
         channel to our domain. Once we have registered, the channel
         will call requestReceived or responseReceived for our messages.
         """
-        self.channel = self.channelFactory.domChannel(self.dom)
+        self.channel = self.channelFactory.domChannel(self.dom,
+                                                      self.remote_port)
         self.idx = self.channel.getIndex()
         if self.majorTypes:
             self.channel.registerDevice(self.getMajorTypes(), self)
@@ -362,8 +364,8 @@ class Controller(CtrlMsgRcvr):
     @type idx:     String
     """
 
-    def __init__(self, factory, dom):
-        CtrlMsgRcvr.__init__(self)
+    def __init__(self, factory, dom, remote_port=0):
+        CtrlMsgRcvr.__init__(self, remote_port=remote_port)
         self.factory = factory
         self.dom = int(dom)
         self.channel = None